package cn.tedu.mall.seckill.timer.job;

import cn.tedu.mall.seckill.mapper.SeckillSpuMapper;
import cn.tedu.mall.seckill.utils.RedisBloomUtils;
import cn.tedu.mall.seckill.utils.SeckillCacheUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import java.time.LocalDate;

public class SeckillBloomInitialJob implements Job {
    @Autowired
    private SeckillSpuMapper seckillSpuMapper;
    @Autowired
    private RedisBloomUtils redisBloomUtils;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //首先确保保存在布隆过滤器的批次的key
        //设计添加两个秒杀批次的布隆过滤器
        //避免两个批次之间的空档期，也允许用户看到下一个批次的商品
        //"spu:bloom:filter:2023-05-10"
        String bloomTodayKey = SeckillCacheUtils.getBloomFilterKey(LocalDate.now());
        //"spu:bloom:filter:2023-05-11"
        String bloomTomorrowKey = SeckillCacheUtils.getBloomFilterKey(LocalDate.now().plusDays(1));
        //实际开发中要到数据库汇总根据秒杀时间查询对应spuId的集合
        //学习阶段，只能将全部的商品保存在布隆过滤器中
        //所以我们查询当前秒杀spu表中所有spuId的集合
        Long[] spuIds = seckillSpuMapper.findAllSeckillSpuIds();
        //布隆过滤器支持String[]类型的数组，将参数保存到redis中
        String[] spuIdsStr = new String[spuIds.length];
        //将spuIds数组中的元素转成String类型保存到spuIdsStr数组中
        for (int i = 0; i < spuIdsStr.length; i++) {
            spuIdsStr[i]=spuIds[i]+"";
        }
        //将赋值完毕的spuIdsStr保存到布隆过滤器中
        redisBloomUtils.bfmadd(bloomTodayKey,spuIdsStr);
        redisBloomUtils.bfmadd(bloomTomorrowKey,spuIdsStr);
        System.out.println("两个批次的布隆过滤器加载完成");

    }
}
